//# sourceURL=http://uMapApp/UI/Panel/PanelBlock/Sorter
define([
    "mhjs/mhjs"
], function (
    mhjs
) {

    function Sorter(option) {

        var _this = this;
        _this.ui = _this.ui || {};

        _this.ui.icon = new mhjs.Div({"class": "icon"});
        _this.ui.label = new mhjs.Div({"class": "label"});

        _this._sorter = new mhjs.Sorter();

        _this._sorter.on("update", function () {
            _this.trigger("update");
        });

        _this._types = [0, 1, -1];

        _this._type = 0;

        mhjs.Div.call(_this, option);
        _this.addClass("sorter");


        _this
            .append(_this.ui.label)
            .append(_this.ui.icon);

        _this.on("click", function () {
            _this.type = _this._types[(_this._types.indexOf(_this.type) + 1) % _this._types.length];
        });

    }

    var _class = Sorter;
    mhjs.Inherit(_class, mhjs.Div);


    Object.defineProperties(_class.prototype, {
        "list"  : {
            set: function (list) {
                var _this = this;
                _this._sorter.list = list;
            },
            get: function () {
                return this._sorter.list;
            }
        },
        "sorter": {
            get: function () {
                return this._sorter;
            }
        },
        "param" : {
            set: function (param) {
                var _this = this;
                _this._param = param;
                _this.ui.label.text(_this._param.label);
            },
            get: function () {
                return this._param;
            }
        },
        "type"  : {
            set: function (type) {
                var _this = this;

                if (_this._types.indexOf(type) >= 0) {

                    _this._type = type;
                    _this.removeClass("asc desc");

                    if (type === 1) {
                        _this.addClass("asc");
                    } else if (type === -1) {
                        _this.addClass("desc");
                    }
                    _this.update();

                }
            },
            get: function () {
                return this._type;
            }
        },
        "update": {
            value: function () {
                var _this = this;
                if (_this.sorter.list && _this.param.value && _this.type !== undefined) {

                    if (_this.type === 0) {
                        _this.sorter.condition = function (a, b) {
                            return 0;
                        };
                    } else {
                        _this.sorter.condition = function (a, b) {
                            if (_this.list[a].getChainChild(_this.param.value) && _this.list[b].getChainChild(_this.param.value)) {
                                return _this.type * (
                                    _this.list[a].getChainChild(_this.param.value) < _this.list[b].getChainChild(_this.param.value) ?
                                        -1 : _this.list[a].getChainChild(_this.param.value) > _this.list[b].getChainChild(_this.param.value) ? 1 : 0
                                );
                            } else {
                                return -1;
                            }
                        };
                    }


                }
            }
        }
    });

    return _class;

});